﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using CapaEntidades;

namespace CapaDatos
{
    public class daCliente
    {

        #region singleton
        private static readonly daCliente _instancia = new daCliente();
        public static daCliente Instancia
        {
            get { return daCliente._instancia; }
        }
        #endregion

        #region Métodos
        public static List<enCliente> spClienteXRazonSocial(String prmRazSocial)
        {
            SqlConnection cn = null;
            SqlCommand cmd = null;
            SqlDataReader dr = null;
            List<enCliente> lstCliente = null;
            try
            {

                cn = Conexion.getConexion();
                cmd = new SqlCommand("spClienteXRazonSocial", cn);
                cmd.Parameters.AddWithValue("@cli_razonSocial", prmRazSocial);
                cmd.CommandType = CommandType.StoredProcedure;
                cn.Open();
                dr = cmd.ExecuteReader();
                lstCliente = new List<enCliente>();
                while (dr.Read())
                {

                    enCliente cliente = new enCliente();
                    cliente.cli_id = Convert.ToInt32(dr[0].ToString());
                    cliente.cli_razonSocial = dr[1].ToString();
                    cliente.cli_rucdni = dr[2].ToString();
                    lstCliente.Add(cliente);
                }
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                dr.Close();
                cn.Close();
            }
            return lstCliente;

        }


        public static List<enCliente> spListarClienteAll()
        {
            SqlConnection cn = null;
            SqlCommand cmd = null;
            SqlDataReader dr = null;
            List<enCliente> lstCliente = null;
            try
            {

                cn = Conexion.getConexion();
                cmd = new SqlCommand("spListarClienteAll", cn);
                cmd.CommandType = CommandType.StoredProcedure;
                cn.Open();
                dr = cmd.ExecuteReader();
                lstCliente = new List<enCliente>();
                while (dr.Read())
                {

                    enCliente cliente = new enCliente();
                    cliente.cli_id = Convert.ToInt32(dr["cli_id"].ToString());
                    cliente.cli_razonSocial = dr["cli_razonSocial"].ToString();
                    cliente.cli_rucdni = dr["cli_rucdni"].ToString();
                    cliente.tipcli_descripcion = dr["tipcli_descripcion"].ToString();
                    cliente.cli_telefono = dr["cli_telefono"].ToString();
                    cliente.cli_direccionFiscal = dr["cli_direccionFiscal"].ToString();
                    cliente.cli_email = dr["cli_email"].ToString();
                    cliente.cli_estado_id = Convert.ToInt32(dr["gen_correlativo"].ToString());
                    cliente.cli_estado = dr["gen_descripcion"].ToString();
                    cliente.tipcli_id = Convert.ToInt32(dr["tipcli_id"].ToString());
                    
                    lstCliente.Add(cliente);
                }
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                dr.Close();
                cn.Close();
            }
            return lstCliente;
        }

        public int InsertarCliente(enCliente l)
        {
            SqlConnection cn = null;
            SqlCommand cmd = null;
            try
            {
                cn = Conexion.getConexion();
                cmd = new SqlCommand("spInsertarCliente", cn);
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.AddWithValue("@prmRUC", l.cli_rucdni);
                cmd.Parameters.AddWithValue("@prmRaz", l.cli_razonSocial);
                cmd.Parameters.AddWithValue("@prmTipoCli_id", l.tipcli_id);
                cmd.Parameters.AddWithValue("@prmTELEFONO", l.cli_telefono);
                cmd.Parameters.AddWithValue("@prmDIRECCION", l.cli_direccionFiscal);
                cmd.Parameters.AddWithValue("@prmEMAIL", l.cli_email);
                //Parametro de Retorno
                SqlParameter retorno = new SqlParameter("@PKCreado", DbType.Int32);
                retorno.Direction = ParameterDirection.ReturnValue;
                cmd.Parameters.Add(retorno);
                cn.Open();
                cmd.ExecuteNonQuery();
                int i = Convert.ToInt32(cmd.Parameters["@PKCreado"].Value);
                return i;
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                cmd.Connection.Close();
            }


     


        }


        public enAlerta spUpdateAlmacen(int idAlm, String dir,int est)
        {
            SqlConnection cn = null;
            SqlCommand cmd = null;
            SqlDataReader dr = null;
            enAlerta lstAlmacen = new enAlerta();
            try
            {

                cn = Conexion.getConexion();
                cmd = new SqlCommand("spUpdateAlmacen", cn);
                cmd.Parameters.AddWithValue("@almCli_id", idAlm);
                cmd.Parameters.AddWithValue("@almCLi_direccion", dir);
                cmd.Parameters.AddWithValue("@almCli_estado", est);
                
                cmd.CommandType = CommandType.StoredProcedure;
                cn.Open();
                dr = cmd.ExecuteReader();
                lstAlmacen.val = -1;
                if (dr.Read())
                {

                    lstAlmacen.val = Convert.ToInt16(dr[0].ToString());
                    lstAlmacen.msg = dr[1].ToString();

                }
            }
            catch (Exception)
            {
                lstAlmacen.val = -1;
                throw;
            }
            finally
            {
                dr.Close();
                cn.Close();
            }
            return lstAlmacen;

        }
    }
     #endregion
}